[SIM-MDL-008] Внедрить бизнес-инвариант State Lock (BUSY) для Вейбулловских задержек
Синхронизация непрерывного стохастического времени задержек с дискретным шагом симулятора
NoteКраткая карточка задачи
- Репозиторий / Компонент:
food-stochastic-simulator/package stochastic. - Тип задачи: Алгоритмическая / Бизнес-логика (Core Math).
- Связанные документы:
model.qmd(Раздел 3. Распределение Вейбулла). - Статус: Готово к реализации
Описание задачи:
Движок Вейбулла (
WeibullEngine) генерирует непрерывную случайную величину длительности действия (delay) твина, округляемую до минут. Возникает алгоритмический рассинхрон: если вычисленное время действия (например, закупка еды в магазине) составляет 3 часа 20 минут, а шаг симулятора равен строго 1 часу, цифровой двойник «улетает» в будущее относительно текущей итерации симулятора. В текущей схеме на следующем часовом тике этот же твин снова начнет выбирать новое действие, что нарушает логику физического времени.Необходимо внедрить инвариант блокировки состояний (State Lock) через введение статуса
BUSY.Инструкция по шагам:
- Расширение структуры состояния шкал: Добавить в системную структуру
DynamicState(и типизированнуюTwinFoodState) новое служебное полеbusy_ticks_left(целое числоint). - Логика фиксации блокировки: В методе оркестратора
processAgentTickпосле вызоваEvaluateBehaviorпроизводить расчет: сколько полных часов (тиков симулятора) занимает сгенерированная задержкаdelay. Еслиdelay > 1 * time.Hour, записывать количество избыточных часов в полеbusy_ticks_left. - Перехват и пропуск итераций Маркова: В самом начале метода
processAgentTickдобавить транзакционный фильтр-барьер. Еслиbusy_ticks_left > 0:- Декрементировать счетчик:
state["busy_ticks_left"] = busy_ticks_left - 1. - Принудительно устанавливать текущее действие в
IDLE. - Пропускать вызов Марковского движка (
PredictNextAction), блокируя принятие новых решений, пока твин физически не завершит предыдущее длительное действие.
- Декрементировать счетчик:
- Эмиссия логов: Каждое пропущенное из-за блокировки состояние должно уходить в Кафку в топик
twin-history-eventsс флагом текущего действияBUSY_LOCKдля сквозного аналитического скоринга.
- Расширение структуры состояния шкал: Добавить в системную структуру